package main
import (
	"fmt"
)
type Test interface {
    Tester()
}
type MyFloat float64

func (m MyFloat) Tester() {
    fmt.Println(m)
}
func describe(t Test) {
    fmt.Printf("Interface type %T value %v\n",t,t)
}

// 18.接口的内部表示
func main(){
    var t Test
    f := MyFloat(12.3)
    t = f
    describe(t)
    f.Tester()
    t.Tester()
    fmt.Printf("\n")

    // 空接口
    s := "Hello Word"
    describeNo(s)
    i := 55
    describeNo(i)
    strt := struct {
        name string
    }{
        name: "yanhao",
    }
    describeNo(strt)

    // 类型断言
    var ass interface{} = 56
    assert(ass)
    var ass1 interface{} = "yanghao"
    assert(ass1)

    // 类型选择（Type Switch）
    findType("yanghao")
    findType(88888)
    findType(12.3)

}

// 空接口
func describeNo(i interface{}) {
    fmt.Printf("Type = %T, value = %v\n", i, i)
}
// 类型断言
func assert(i interface{}) {
    s, ok := i.(int)
    fmt.Println(s, ok)
}
// 类型选择（Type Switch）
func findType(i interface{}) {
    switch i.(type) {
    case string:
        fmt.Printf("string value %s\n", i.(string))
    case int:
        fmt.Printf("int value %d\n", i.(int))
    default:
        fmt.Printf("Unknown type\n")
    }

}
